#ifndef __CLAVECANDIDATA_H__
#define __CLAVECANDIDATA_H__

#include "Tipos.h"


class CClaveCandidata
{
public:
	string nombre;
	string  marca;
	TIPO_DATO codProd;
	CClaveCandidata(){}
	CClaveCandidata(string registro);
	CClaveCandidata(string _nombre, string _marca);	
	~CClaveCandidata(){}
	TIPO_DATO getTamanio(){return (TIPO_DATO)(nombre.length() + marca.length() + sizeof(TIPO_DATO) + TAMANIO_BYTE_DIN*2);}
	TIPO_DATO getTamanioNodo(){return (TIPO_DATO)(nombre.length() + marca.length() + TAMANIO_BYTE_DIN*2);}
	string getClave(){return nombre+marca;}
	TIPO_DATO getCodProducto(){return this->codProd;}
	TIPO_DATO getCodProducto(int indice){return 0;}
	TIPO_DATO getIndice(){return 0;}
	string getNombre(){return nombre;}
	string getMarca(){return marca;}
	void setIndice(int indice){}
	bool obtenerNroBloque(TIPO_DATO &nroBloqueOut,fstream &archivo){return true;}
	bool eliminarElemVector(TIPO_DATO claveIn,fstream &archivo){return false;}
	
	int transformar(string datos, TIPO_DATO &pos);
	string desTransformar();
	string desTransformarNodo();
	int transformarNodo(string datos, TIPO_DATO &pos);

	//OPERADORES
	CClaveCandidata &operator=(CClaveCandidata & clave);
	bool operator==(const CClaveCandidata &clave) const;
	bool operator<(const CClaveCandidata &clave) const;	
	//FIN DE OPERADORES
    bool operator()(CClaveCandidata& inicio, CClaveCandidata& fin)
    {
    	if(inicio.getClave().compare(fin.getClave()))
    		return true;
    	return false;
//	    return inicio.getClave() < fin.getClave();
    }
	void mostrar();
	
	void insertarVectorSec(TIPO_DATO codProdIn,fstream &archivo){}
};

/*-----------------------------------------------------------*/
CClaveCandidata::CClaveCandidata(string _nombre, string _marca)
{
	this->nombre = _nombre;
	this->marca = _marca;
	this->codProd = 0;
}

/*-----------------------------------------------------------*/
CClaveCandidata::CClaveCandidata(string registro)
{
	TIPO_DATO cantByte=0, posicion=0;
	marca="";
	nombre="";
	
	//codigo de producto
	codProd 	= atoi(registro.substr(0,5).c_str());
	posicion 	+= 	5;
	//codProd 	= 	string2TipoDato(registro.substr(posicion,TAMANIO_COD_PROD));
	//posicion 	+= 	TAMANIO_COD_PROD;

	//marca	
	cantByte 	= 	string2TipoDato(registro.substr(posicion,TAMANIO_BYTE_DIN));	
	posicion 	+= 	TAMANIO_BYTE_DIN;
	marca 		= 	registro.substr(posicion,cantByte);
	posicion 	+= 	cantByte;
		
	//nombre
	cantByte 	= 	string2TipoDato(registro.substr(posicion,TAMANIO_BYTE_DIN));		
	posicion 	+= 	TAMANIO_BYTE_DIN;
	nombre 		= 	registro.substr(posicion,cantByte);	
	posicion 	+= cantByte;
		
	/* antes del exportar
	//codProd = string2TipoDato(registro.substr(0,4));
	codProd = atoi(registro.substr(0,5).c_str());
	posicion+=5;
	tamanio = string2TipoDato(registro.substr(posicion,TAMANIO_BYTE_DIN));
	posicion+= TAMANIO_BYTE_DIN;
	marca = registro.substr(posicion,tamanio);
	posicion+=tamanio;
	tamanio = string2TipoDato(registro.substr(posicion,TAMANIO_BYTE_DIN));
	posicion += TAMANIO_BYTE_DIN;
	nombre = registro.substr(posicion,tamanio);
	*/
}

/*-----------------------------------------------------------*/
void CClaveCandidata::mostrar() /* = std::cout*/
{				
	cout<<"Nombre: "<<nombre<<"; Marca: "<<marca<<"; Codigo: "<<codProd<<endl;	
}
/*-----------------------------------------------------------*/
int CClaveCandidata::transformar(string datos, TIPO_DATO &posicion)
{	
	TIPO_DATO tamanioDatos=0;
	int cantByte;
	
	//codigo
	//codProd = atoi(datos.substr(0,5).c_str());
	//posicion 	+= 	5;
	codProd 	= 	string2TipoDato(datos.substr(posicion,TAMANIO_COD_PROD));
	posicion	+=	TAMANIO_COD_PROD;
	/*como la marca y el nombre son dinamicos como */
	
	//marca
	cantByte 	= 	string2TipoDato(datos.substr(posicion,TAMANIO_BYTE_DIN));	
	tamanioDatos += cantByte;
	posicion 	+= 	TAMANIO_BYTE_DIN;
	marca 		= 	datos.substr(posicion,cantByte);
	posicion 	+= 	cantByte;	

	//nombre
	cantByte 	= 	string2TipoDato(datos.substr(posicion,TAMANIO_BYTE_DIN));	
	tamanioDatos +=	cantByte;
	posicion 	+= 	TAMANIO_BYTE_DIN;
	nombre 		= 	datos.substr(posicion,cantByte);
	posicion 	+= 	cantByte;

	return tamanioDatos + TAMANIO_COD_PROD + TAMANIO_BYTE_DIN*2;
}	
/*-----------------------------------------------------------*/
string CClaveCandidata::desTransformar()
{
	string dato="";
//	char numero[10];
	//dato+=itoa(codProd,numero,10);
	dato += convertirChar(codProd,TAMANIO_COD_PROD);
	
	//dato+=itoa((int)marca.length(),numero,10);
	dato += convertirChar((int)marca.length(),TAMANIO_BYTE_DIN);
	dato +=	marca;

	//dato+=itoa((int)nombre.length(),numero,10);
	dato+=	convertirChar((int)nombre.length(),TAMANIO_BYTE_DIN);
	dato+=	nombre;
	
	return dato;
}
/*-----------------------------------------------------------*/
int CClaveCandidata::transformarNodo(string datos, TIPO_DATO &posicion)
{
	TIPO_DATO tamanioDatos=0;
	int cantByte;
//	codProd = string2TipoDato(datos.substr(posicion,TAMANIO_COD_PROD));
//	posicion+=TAMANIO_COD_PROD;

	/*como la marca y el nombre son dinamicos como */
	cantByte = string2TipoDato(datos.substr(posicion,TAMANIO_BYTE_DIN));	
	tamanioDatos += cantByte;
	posicion += TAMANIO_BYTE_DIN;
	nombre = datos.substr(posicion,cantByte);
	posicion += cantByte;

	cantByte = string2TipoDato(datos.substr(posicion,TAMANIO_BYTE_DIN));	
	tamanioDatos += cantByte;
	posicion += TAMANIO_BYTE_DIN;
	marca = datos.substr(posicion,cantByte);
	posicion += cantByte;


	return tamanioDatos + TAMANIO_BYTE_DIN*2;
}	
/*-----------------------------------------------------------*/
string CClaveCandidata::desTransformarNodo()
{
	string dato="";
//	char numero[10];
	//dato+=itoa(codProd,numero,10);
//	dato+=convertirChar(codProd,TAMANIO_COD_PROD);

	//dato+=itoa((int)nombre.length(),numero,10);
	dato += convertirChar((int)nombre.length(),TAMANIO_BYTE_DIN);
	dato += nombre;
	
	//dato+=itoa((int)marca.length(),numero,10);
	dato += convertirChar((int)marca.length(),TAMANIO_BYTE_DIN);
	dato += marca;

	return dato;
}

/*-----------------------------------------------------------*/
CClaveCandidata &CClaveCandidata::operator=(CClaveCandidata & clave)
{
	if(this==&clave)
		return *this;
	codProd = clave.codProd;
	nombre = clave.nombre;
	marca = clave.marca;
	return *this;	
}
/*-----------------------------------------------------------*/
bool CClaveCandidata::operator==(const CClaveCandidata &clave) const
{
	return (nombre+ marca).compare(clave.nombre + clave.marca)==0;
}
/*-----------------------------------------------------------*/
bool CClaveCandidata::operator<(const CClaveCandidata &clave) const
{
	return (nombre + marca).compare(clave.nombre + clave.marca)==-1;
}
/*-----------------------------------------------------------*/

#endif //__CLAVECANDIDATA_H__
